package datastorage;

import unit.data.Message;

import java.util.Map;

/**
 * Интерфейс доступа к хранилищу данных.
 * <p/>
 * Обеспечивает поддержку всех необходимых серверу операций с данными о пользователях.
 *
 * @author Yuri Denison
 * @since 04.08.11
 */
public interface DataStorage {
    /**
     * Возвращает ID пользователя, которому соответствует указанный логин.
     * <p/>
     * Если пароль пользователя, которому соответствует указанный логин, не совпадает с указанным паролем,
     * то возвращается -1
     *
     * @param login    логин пользователя (уникален для каждого пользователя)
     * @param password пароль
     * @return ID пользователя, которому соответствует указанный логин,
     *         или -1 если указанный пароль не совпадает с паролем пользователя
     */
    public int getUserID(String login, String password);

    /**
     * Создаёт запись о новом пользователе
     * <p/>
     * Все значения параметров информации о контакте принимают значения по умолчанию.
     *
     * @param login    логин пользователя
     * @param password пароль пользователя
     * @return ID пользователя
     */
    public int addNewUser(String login, String password);

    /**
     * Изменяет информацию о пользователе.
     * <p/>
     * Обновляет значения параметров, имена которых указаны в проекции, выставляя им указанные новые значения
     *
     * @param userID     ID пользователя, информацию о котором следует изменить
     * @param projective имена параметров, подлежащих изменению
     * @param values     значения параметров, подлежащих изменению
     */
    public void changeUserInfo(int userID, String[] projective, String[] values);

    /**
     * Возвращает набор всех имён параметров информации о пользователе
     *
     * @return набор всех имён параметров информации о пользователе
     */
    public String[] getUserInfoProjective();

    /**
     * Возвращает набор ID контактов пользователя с указанным ID
     *
     * @param userID ID пользователя
     * @return набор ID контактов пользователя с указанным ID
     */
    public int[] getContactList(int userID);

    /**
     * Добавляет нового пользователя в список контактов
     *
     * @param userID       ID пользователя
     * @param newContactID ID нового контакта пользователя
     * @return boolean true, если операция прошла успешно
     */
    public boolean addToContactList(int userID, int newContactID);

    /**
     * Возвращает информацию о контактах пользователя с указанным ID
     *
     * @param userID     ID пользователя
     * @param projective список имён параметров информации о контакте или <code>null</code>
     * @return двумерный массив значений параметров информации о пользователе, где:
     *         <p/>
     *         первый индекс - номер контакта из списка контактов
     *         <p/>
     *         второй индекс - номер параметра из списка параметров, имена которых были указаны,
     *         или из списка всех параметров информации о пользователе, если списка параметров не указанно
     */
    public String[][] getContactListInfo(int userID, String[] projective);

    /**
     * Добавляет сообщение в историю сообщений
     *
     * @param message сообщение
     */
    public void addMessageToHistory(Message message);

    /**
     * Возвращает историю сообщений с собеседником
     *
     * @param userID         ID юзера
     * @param interlocutorID ID собеседника
     * @param size           количество последних сообщений. Если 0, вернутся все сообщения
     * @return массив сообщений, если история пуста, вернется пустой массив
     */
    public Message[] getMessagesFromHistory(int userID, int interlocutorID, int size);

    /**
     * Возвращает массив сообщений в текстовом представлении, отправленных оффлайн пользователю
     *
     * @param receiverID ID получателя
     * @return массив сообщений в текстовом представлении, отправленных оффлайн пользователю
     */
    public Message[] getOfflineMessages(int receiverID);

    /**
     * Добавляет пользователя в серверный список  другого пользователя
     *
     * @param userId         ID пользователя
     * @param serverListType тип серверного списка
     *                       1 - черный список, 2 - список видимых, 3 - список невидимых
     * @param contactId      ID добавляемого пользователя
     * @return boolean true, если операция прошла успешно
     */
    public boolean addToServerList(int userId, int serverListType, int contactId);

    /**
     * Поисковый запрос на сервер пользователей по их Nick'у
     *
     * @param searchQuery поисковый запрос
     * @return HashMap (логин, id) юзеров, подподающих под поисковый запрос
     */
    public Map<String, Integer> getSearchResult(String searchQuery);
}

